#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
数据组装功能使用示例

本示例展示如何使用BasicOrderHandler的新数据组装功能：
1. 获取主数据
2. 组装完整数据（包括主体数据、转换字段等）
3. 数据处理和写入
"""

import asyncio
import sys
import os
from datetime import datetime, timedelta
from typing import List, Dict, Any

# 添加项目根目录到路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from src.basic_order_handler import BasicOrderHandler
from loguru import logger


class DataAssemblyExample:
    """数据组装功能示例类"""
    
    def __init__(self):
        self.handler = None
    
    async def __aenter__(self):
        self.handler = BasicOrderHandler(max_connections=5)
        await self.handler.__aenter__()
        return self
    
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        if self.handler:
            await self.handler.__aexit__(exc_type, exc_val, exc_tb)
    
    async def example_basic_assembly(self):
        """基础数据组装示例"""
        logger.info("=== 基础数据组装示例 ===")
        
        # 1. 获取最近1小时的主数据
        start_time, end_time = self.handler.get_last_time_range()
        main_data = await self.handler.fetch_main_data(start_time, end_time)
        
        if not main_data:
            logger.info("没有找到主数据")
            return
        
        logger.info(f"获取到 {len(main_data)} 条主数据")
        
        # 2. 取前5条进行示例组装
        sample_data = main_data[:5]
        
        # 3. 组装完整数据
        assembled_data = await self.handler.assemble_complete_data(sample_data)
        
        # 4. 展示组装结果
        for i, item in enumerate(assembled_data):
            logger.info(f"组装数据 {i+1}:")
            logger.info(f"  原始ID: {item.get('id')}")
            logger.info(f"  工单ID: {item.get('WorkOrderId')}")
            logger.info(f"  转换后服务名: {item.get('TransformedServiceName')}")
            logger.info(f"  价格等级: {item.get('PriceLevel')}")
            logger.info(f"  主体ID: {item.get('mainpart_mainpart_id')}")
            logger.info(f"  主体名称: {item.get('mainpart_mainpart_name')}")
            logger.info("---")
    
    async def example_field_transformation(self):
        """字段转换示例"""
        logger.info("=== 字段转换示例 ===")
        
        # 模拟一些ID
        test_ids = ['12345', '12346', '12347']
        
        # 执行字段转换
        transformed_fields = await self.handler.transform_fields_by_ids(test_ids)
        
        logger.info(f"转换了 {len(transformed_fields)} 个ID的字段")
        for id_val, fields in transformed_fields.items():
            logger.info(f"ID {id_val} 的转换字段:")
            for field_name, field_value in fields.items():
                logger.info(f"  {field_name}: {field_value}")
    
    async def example_mainpart_data(self):
        """主体数据获取示例"""
        logger.info("=== 主体数据获取示例 ===")
        
        # 模拟一些工单ID
        test_ids = ['WO001', 'WO002', 'WO003']
        
        # 获取主体数据
        mainpart_data = await self.handler.fetch_mainpart_data_batch(test_ids)
        
        logger.info(f"获取到 {len(mainpart_data)} 条主体数据")
        for item in mainpart_data:
            logger.info(f"工单ID: {item.get('work_order_id')}")
            logger.info(f"主体ID: {item.get('mainpart_id')}")
            logger.info(f"主体名称: {item.get('mainpart_name')}")
            logger.info("---")
    
    async def example_complete_workflow(self):
        """完整工作流程示例"""
        logger.info("=== 完整工作流程示例 ===")
        
        try:
            # 1. 获取主数据
            start_time, end_time = self.handler.get_last_time_range()
            logger.info(f"查询时间范围: {start_time} 到 {end_time}")
            
            main_data = await self.handler.fetch_main_data(start_time, end_time)
            logger.info(f"获取主数据: {len(main_data)} 条")
            
            if not main_data:
                logger.info("没有数据需要处理")
                return
            
            # 2. 分批处理（模拟大数据量场景）
            batch_size = 10
            total_processed = 0
            
            for i in range(0, len(main_data), batch_size):
                batch = main_data[i:i+batch_size]
                logger.info(f"处理批次 {i//batch_size + 1}, 数据量: {len(batch)}")
                
                # 3. 组装完整数据
                assembled_data = await self.handler.assemble_complete_data(batch)
                
                # 4. 数据质量检查
                valid_data = self._validate_assembled_data(assembled_data)
                logger.info(f"有效数据: {len(valid_data)} 条")
                
                # 5. 模拟写入（实际场景中调用 insert_target_batch）
                # await self.handler.insert_target_batch(valid_data)
                logger.info(f"模拟写入 {len(valid_data)} 条数据")
                
                total_processed += len(valid_data)
            
            logger.info(f"完整流程处理完成，总计处理: {total_processed} 条数据")
            
        except Exception as e:
            logger.error(f"完整工作流程执行失败: {e}")
            raise
    
    def _validate_assembled_data(self, data: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
        """数据质量验证"""
        valid_data = []
        
        for item in data:
            # 基础字段检查
            if not item.get('id'):
                logger.warning(f"数据缺少ID字段: {item}")
                continue
            
            # 业务逻辑检查
            if item.get('WorkStatus') == 'CANCELLED':
                logger.info(f"跳过已取消的工单: {item.get('id')}")
                continue
            
            # 数据完整性检查
            required_fields = ['WorkOrderId', 'ServiceCode']
            missing_fields = [field for field in required_fields if not item.get(field)]
            
            if missing_fields:
                logger.warning(f"数据缺少必要字段 {missing_fields}: ID={item.get('id')}")
                continue
            
            valid_data.append(item)
        
        return valid_data


async def run_examples():
    """运行所有示例"""
    async with DataAssemblyExample() as example:
        try:
            # 运行各种示例
            await example.example_basic_assembly()
            await example.example_field_transformation()
            await example.example_mainpart_data()
            await example.example_complete_workflow()
            
        except Exception as e:
            logger.error(f"示例运行失败: {e}")
            raise


if __name__ == "__main__":
    # 配置日志
    logger.remove()
    logger.add(
        sys.stdout,
        format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
        level="INFO"
    )
    
    # 运行示例
    asyncio.run(run_examples())